home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / yacas_alg / yacas_morphos / share / yacas / cstubgen.rep / code.ys.def next >
Encoding:
Text File  |  2002-03-13  |  5.3 KB  |  269 lines

  1.  
  2. /*
  3. document:
  4. - StubApiCStruct
  5. - StubApiCShortIntegerConstant(_onearg)
  6. */
  7.  
  8.  
  9. StubApiCStart():=
  10. [
  11.   cconsts := "";
  12.   cfuncs  := "";
  13.   cadders := "";
  14.   cincludes:="";
  15.   cremarks:="";
  16.   cstructs:={};
  17. ];
  18.  
  19.  
  20.  
  21. StubApiCStruct(name) := StubApiCStruct(name,"PlatFree");
  22. StubApiCStruct(name,free):=
  23. [
  24.   cremarks:=cremarks:
  25.   "----------------------------------------":Nl():
  26.   "Declared struct ":name:Nl();
  27.   cstructs[name]:=free;
  28. ];
  29.  
  30.  
  31. StubApiCRemark(text):=
  32. [
  33.   cremarks:=cremarks:text:Nl();
  34. ];
  35.  
  36. StubApiCSetEnv(string):=
  37. [
  38.   cadders := cadders: "  ":string:"(aEnvironment);
  39.   ";
  40. ];
  41.  
  42. StubApiCShortIntegerConstant(const,val) :=
  43. [
  44.   cremarks:=cremarks:
  45.   "----------------------------------------":Nl():
  46.   "Constant ":const:" referred to in the library as ":val:
  47. "
  48. ";
  49.   cconsts:= cconsts:PatchString(
  50. "  SetShortIntegerConstant(aEnvironment, <?Write(const);?>, <?WriteString(val  );?>);
  51. ");
  52. ];
  53.  
  54. /* Use this one for defines */
  55. StubApiCShortIntegerConstant(_onearg) <--
  56.   StubApiCShortIntegerConstant(onearg,onearg);
  57.  
  58.  
  59.  
  60. StubApiCInclude(file):=
  61. [
  62. cincludes:=cincludes : "#include ":file:"
  63. ";
  64. ];
  65.  
  66. CArgsGet(args_IsList) <--
  67. [
  68.   Local(arg,i);
  69.   i:=1;
  70.   ForEach(arg,args)
  71.   [
  72.     CArgsGet(CArgType(arg),i);
  73.     i++;
  74.   ];
  75. ];
  76.  
  77. 10 # CArgType(arg_IsList)<-- arg[1];
  78. 20 # CArgType(arg_IsString)<-- arg;
  79.  
  80. 10 # CArgName(arg_IsList,_i)_(Length(arg)>1) <-- arg[2];
  81. 20 # CArgName(_arg,_i) <-- "arg":String(i);
  82.  
  83. 20 # CArgsGet("int",_i) <--
  84. [
  85.  
  86.  
  87.  WriteString(PatchString(
  88. "  ShortIntegerArgument(g, <? WriteString(\"arg\":String(i)); ?>, LispTrue);
  89. "));
  90. ];
  91.  
  92.  
  93. 20 # CArgsGet("double",_i) <--
  94. [
  95.  WriteString(PatchString(
  96. "  DoubleFloatArgument(g,<? WriteString(\"arg\":String(i)); ?>,LispTrue);
  97. "));
  98. ];
  99.  
  100. 20 # CArgsGet("input_string",_i) <--
  101. [
  102.  WriteString(PatchString(
  103. "  InpStringArgument(g,<? WriteString(\"arg\":String(i)); ?>,LispTrue);
  104. "));
  105. ];
  106.  
  107. 30 # CArgsGet(name_IsString,_i)_(cstructs[name] != Empty) <--
  108. [
  109.  WriteString(PatchString(
  110. "  VoidStructArgument(<?WriteString(name);?>,g,<? WriteString(\"arg\":String(i)); ?>,LispTrue,<?Write(name);?>);
  111. "));
  112. ];
  113.  
  114.  
  115.  
  116.  
  117. 100 # CArgsGet(_a,_i) <-- Check(False,"Argument type ":a:" not supported");
  118.  
  119. CCall(returntype,fname,args):=
  120. [
  121.  WriteString(fname);
  122.  WriteString("(");
  123.  Local(i);
  124.  For (i:=1,i<=Length(args),i++)
  125.      [
  126.       If(i>1,WriteString(", "));
  127.      WriteString("arg":String(i));
  128.      ];
  129.  WriteString(");");
  130. ];
  131.  
  132. 10  # CReturnResult("void") <--
  133.     WriteString("  InternalTrue(aEnvironment,aResult);");
  134.  
  135. 10  # CReturnResult("int") <--
  136.     WriteString("  ReturnShortInteger(aEnvironment,aResult,r);");
  137. 10  # CReturnResult("double") <--
  138.     WriteString("  ReturnDoubleFloat(aEnvironment,aResult,r);");
  139.  
  140. 20  # CReturnResult(name_IsString)_(cstructs[name] != Empty)<--
  141.  
  142.     WriteString("  ReturnVoidStruct(aEnvironment, aResult,":String(name):", r,":cstructs[name]:");");
  143.  
  144. 100 # CReturnResult(_r) <-- Check(False,"Return type ":r:" not supported");
  145.  
  146.  
  147. 10  # CCallContain("void") <-- True;
  148. 10  # CCallContain("int") <-- WriteString("int r = ");
  149. 10  # CCallContain("double") <-- WriteString("double r = ");
  150.  
  151. 20  # CCallContain(name_IsString)_(cstructs[name] != Empty)<--
  152.       WriteString("void* r = ");
  153. 100 # CCallContain(_r) <-- Check(False,"Return type ":r:" not supported");
  154.  
  155.  
  156.  
  157. funcstring:=
  158. "
  159. static void base_<? WriteString(fname); ?>(LispEnvironment& aEnvironment, LispPtr& aResult,
  160.                            LispPtr& aArguments)
  161. {
  162.   /* Obtain arguments passed in. */
  163.   LispArgGetter g(aEnvironment, aArguments);
  164. <?
  165. CArgsGet(args);
  166. ?>  g.Finalize(<?Write(Length(args));?>);
  167.  
  168.   /* Call the actual function. */
  169. <?CCallContain(returntype);?> <?CCall(returntype,fname,args); ?>
  170.  
  171. /* Return result. */
  172. <?
  173. CReturnResult(returntype);
  174. ?>
  175. }
  176. ";
  177.  
  178.  
  179. cadderstring:=
  180. "  aEnvironment.SetCommand(base_<? WriteString(fname); ?>, <? Write(fname2); ?>);
  181. ";
  182.  
  183. fileapi:=
  184. "
  185. /* This file was automatically generated with cstubgen.
  186. */
  187. #include \"lisptype.h\"
  188. #include \"lispenvironment.h\"
  189. #include \"lispatom.h\"
  190. #include \"standard.h\"
  191. #include \"arggetter.h\"
  192. #include \"lispplugin.h\"
  193. #include \"platmath.h\"
  194. #include \"stubs.h\"
  195. #include \"genericstructs.h\"
  196.  
  197. <?
  198. WriteString(cincludes);
  199. ?>
  200. <?
  201. WriteString(cfuncs);
  202. ?> 
  203.  
  204.  
  205. class ThisPlugin : public LispPluginBase
  206. {
  207. public:
  208.     virtual void Add(LispEnvironment& aEnvironment);
  209. };
  210. void ThisPlugin::Add(LispEnvironment& aEnvironment)
  211. {
  212. <?
  213. WriteString(cconsts);
  214. ?>
  215. <?
  216. WriteString(cadders);
  217. ?>}
  218.  
  219.  
  220. extern \"C\" {
  221. LispPluginBase* maker(void)
  222. {
  223.     return new ThisPlugin;
  224. }
  225.  
  226. };
  227.  
  228. ";
  229.  
  230. StubApiCDocumentFunction(returntype,fname,fname2,args):=
  231. [
  232.   cremarks:=cremarks:
  233.   "----------------------------------------":Nl():
  234.   "Function ":fname2:Nl():" (referred to within the original library as ":fname:
  235.   ")":Nl():" with return type ":CArgType(returntype):" and arguments:
  236. ";
  237.   Local(arg,i);
  238.   i:=1;
  239.   ForEach(arg,args)
  240.   [
  241.     cremarks:=cremarks:String(i):". ":CArgType(arg):" ":CArgName(arg,i):Nl();
  242.     i++;
  243.   ];
  244.  
  245. ];
  246.  
  247. StubApiCFunction(returntype,fname,args) :=
  248. [
  249.   Local(fname2);
  250.   cfuncs:= cfuncs:PatchString(funcstring);
  251.   fname2:=fname;
  252.   cadders:=cadders:PatchString(cadderstring);
  253.   StubApiCDocumentFunction(returntype,fname,fname2,args);
  254. ];
  255.  
  256. StubApiCFunction(returntype,fname,fname2,args) :=
  257. [
  258.   cfuncs:= cfuncs:PatchString(funcstring);
  259.   cadders:=cadders:PatchString(cadderstring);
  260.   StubApiCDocumentFunction(returntype,fname,fname2,args);
  261. ];
  262.  
  263.  
  264. StubApiCFile(file):=
  265. [
  266.   ToFile(file:".cc")WriteString(PatchString(fileapi));
  267.   ToFile(file:".description")WriteString(cremarks);
  268. ];
  269.